1
Путь к выполнению: понимание компиляторного драйвера
AI031Lesson 7
00:00

Оркестрант: компиляторный драйвер

Представьте, что компиляторный драйвер (например, как GCC) как великолепный дирижёр. Он автоматизирует сложную трансформацию из читаемого человеком исходного кода в бинарный исполняемый файл. Этот путь — Путь к выполнению, начинается с времени компиляции и продолжается до времени загрузки и времени выполнения.

Используя отдельную компиляцию, драйвер обрабатывает main.c и sum.c независимо. Изменения в одном модуле не требуют повторной трансляции всего проекта — только изменённый файл проходит через препроцессор (cpp), компилятор (cc1), ассемблер (as) перед тем, как линкер (ld) объединяет полученные перемещаемые объектные файлы.

main.ccpp/cc1/asmain.osum.ccpp/cc1/assum.oldprogАппаратная перспектива: отображение кэша по адресу 0x064C Адрес: 0 0110 0100 11xx | строка кэша размером 32 байта Тег: 0 0110 01Множество: 00Смещение: 11xxАнализ шаблона обращений с шагом 1 обеспечивает пропускную способность кэша L1.

Эффективность и иерархия памяти

Решения линкера по размещению для grid[0][0] или src[0][0] непосредственно влияют на Пропускную способность и Задержку. Выравнивание данных в строке кэша размером 32 байта, драйвер обеспечивает шаблон обращений с шагом 1, минимизируя холодные промахи и избегая вытеснений при сканировании по столбцам. В продвинутых высокопроизводительных кодах, параллелизм раскрученных циклов ($4 \times 4$ раскрученный цикл) дополнительно маскирует отображение основной памяти в кэш задержки за счёт оптимизации циклов частоты тактирования (0x32, 0x1, 0x4, 0x51).

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>